﻿// using UnityEngine;
// using System.Collections;
// using System.Collections.Generic;
// using TTGame;
//
// /*
//  * BattleServerData
//  *
//  * 战斗数据
//  * 从服务器接收。
//  *
//  * 依赖：
//  *
//  * ！不写重复代码！
//  * @author TTun
//  * @date 9/12/2017 4:10:19 PM
//  */
// namespace TTGameEngine {
//
// public class BattleServerData {
//     private static BattleServerData instance;
//     public static BattleServerData Share(bool isCheckServerData = true) {
//         if(instance == null) {
//             instance = new BattleServerData();
//         }
//         if(isCheckServerData) instance.CheckServerDataOK();
//         return instance;
//     }
//     public class SkillSData {
//         public string name;
//         public int id;
//         public int local_id;
//         public SkillClass skillClass;        //技能类型
//
//         public int target;      //目标选择优先级
//         public string condition;    //自动战斗中技能释放的条件
//         public int lv;          //技能等级
//         public float cd;          //冷却时间
//         public int consume;     //消耗怒气
//         public int anger;       //获取怒气
//         public HurtType hurt_type;   //受伤类型
//         public int max;         //最大伤敌数
//         public float ratio;       //伤害系数
//         public float add;         //附加伤害
//         public float crit;        //暴击概率
//         public int skillDmgType;     //技能类型：0=伤害类 1=治疗类 2=我方单体增益 3=我方群体增益 4=敌方单体减益 5=敌方群体减益
//         //<BuffID, 触发几率> 技能携带的Buff的Buff触发几率
//         public Dictionary<int, float> buffProbs = new Dictionary<int, float>();
//
//         public static SkillSData CreateWithSData(Dictionary<string, object> data) {
//             SkillSData mdata = new SkillSData();
//
//             mdata.id = data.intValueForKey("id");
//             mdata.local_id = data.intValueForKey("local_id");
//             mdata.skillClass = (SkillClass)data.intValueForKey("type");
//             mdata.target = data.intValueForKey("target");
//             mdata.condition = data.valueForKey("condition");
//             mdata.lv = data.intValueForKey("lv");
//             mdata.cd = data.floatValueForKey("cd");
//             mdata.consume = data.intValueForKey("consume");
//             mdata.anger = data.intValueForKey("anger");
//             mdata.hurt_type = (HurtType)data.intValueForKey("hurt_type");
//             mdata.max = data.intValueForKey("max");
//             mdata.ratio = data.floatValueForKey("ratio") / 100f;
//             mdata.add = data.floatValueForKey("add");
//             mdata.crit = data.floatValueForKey("crit") / 100f;
//             mdata.skillDmgType = data.intValueForKey("skillType", -1);
//             string buffIDValue = data.valueForKey("buff_id");
//             if(string.IsNullOrEmpty(buffIDValue) == false) {
//                 string[] buffIDAndProb = buffIDValue.Split(';', '|');
//                 for(int i = 0; i < buffIDAndProb.Length; i += 2) {
//                     mdata.buffProbs.Add(buffIDAndProb[i].intValue(), buffIDAndProb[i + 1].floatValue());
//                 }
//             }
//             LTSkillConfigInfo skillConfig = LTHeroController.getInstance().getSkillConfigInfo(mdata.id);
//             if(skillConfig != null) {
//                 mdata.name = skillConfig.name;
//             }
//             return mdata;
//         }
//     }
//     public class BuffSData {
//         public int id;
//         public int type;
//         public string effect;
//         public string effectPos;
//         public int last;
//         public int update;
//         public int OverLayType;
//         public int OverLayPriority;
//         public string gain;
//         public int par_1;
//         public int par_2;
//         public int par_3;
//
//         public static BuffSData CreateWithSData(Dictionary<string, object> data) {
//             BuffSData buff = new BuffSData();
//             buff.id = data.intValueForKey("id");
//             buff.type = data.intValueForKey("type");
//             string effectValue = data.valueForKey("effect");
//             buff.last = data.intValueForKey("last");
//             buff.update = data.intValueForKey("update");
//             string priorValue = data.valueForKey("prior");
//             buff.gain = data.valueForKey("gain");
//             buff.par_1 = data.intValueForKey("par_1");
//             buff.par_2 = data.intValueForKey("par_2");
//             buff.par_3 = data.intValueForKey("par_3");
//
//             if(string.IsNullOrEmpty(priorValue)) {
//                 buff.OverLayType = 0;
//                 buff.OverLayPriority = 0;
//             } else {
//                 string[] overLayParam = priorValue.Split(';');
//                 buff.OverLayType = overLayParam[0].intValue();
//                 if(overLayParam.Length > 1) {
//                     buff.OverLayPriority = overLayParam[1].intValue();
//                 } else {
//                     buff.OverLayPriority = 0;
//                 }
//             }
//             if(string.IsNullOrEmpty(effectValue) == false) {
//                 string[] effectParam = effectValue.Split(';');
//                 buff.effect = effectParam[0];
//                 buff.effectPos = effectParam[1];
//             }
//
//             return buff;
//         }
//     }
//     public class FetterSData {
//         public int id;
//         public int type;
//         public List<int> needIds = new List<int>();
//         //hero int属性ID，目前是Prop_hp、Prop_att，即4、5
//         //羁绊的血量增加，由服务器直接增加。 伤害增加，是指人物最终伤害增加，不是指攻击力。由客户端处理。
//         public int attType;
//         public float attValue;//百分比。
//
//         public static FetterSData CreateWithSData(Dictionary<string, object> data) {
//             FetterSData fetter = new FetterSData();
//             fetter.id = data.intValueForKey("id");
//             fetter.type = data.intValueForKey("type"); //type=1按id，=2按type
//             var list = data.objectForKey("needIds").listValue(); //需要的Ids or types
//             for(int i = 0; i < list.Count; i++) {
//                 fetter.needIds.Add((int)list[i]);
//             }
//             fetter.attType = data.intValueForKey("attType");
//             fetter.attValue = data.intValueForKey("attValue") / 100f;
//
//             return fetter;
//         }
//     }
//
//     public class WaveInfo {
//         public List<int> monsterIDs = new List<int>();
//         public List<int> seatIDs = new List<int>();
//
//         public void AddWaveMonster(int monsterID, int seatID) {
//             monsterIDs.Add(monsterID);
//             seatIDs.Add(seatID);
//         }
//     }
//
//     public class BattleMonsterSData {
//         //<怪物ID，出生点>
//         public List<WaveInfo> monsterWaves = new List<WaveInfo>();
//         public Dictionary<int, MonsterObjSData> monsterTable = new Dictionary<int, MonsterObjSData>();
//
//         public static BattleMonsterSData CreateWithSData(Dictionary<string, object> data) {
//             BattleMonsterSData monsters = new BattleMonsterSData();
//
//             IList monsterValueList = data.objectForKey("monster").listValue();
//             if(monsterValueList != null) {
//                 for(int i = 0; i < monsterValueList.Count; i++) {
//                     string monsterValue = monsterValueList[i].ToString();
//                     if(string.IsNullOrEmpty(monsterValue) == false) {
//                         string[] monsterParam = monsterValue.Split(';', '|');
//                         WaveInfo waveInfo = new WaveInfo();
//                         for(int j = 0; j < monsterParam.Length; j += 2) {
//                             waveInfo.AddWaveMonster(monsterParam[j].intValue(), monsterParam[j + 1].intValue());
//                         }
//                         monsters.monsterWaves.Add(waveInfo);
//                     }
//                 }
//             }
//             IList monsterConfigList = data.objectForKey("monsterTable").listValue();
//             if(monsterConfigList != null) {
//                 for(int i = 0; i < monsterConfigList.Count; i++) {
//                     MonsterObjSData monsterData = MonsterObjSData.CreateWithSData(monsterConfigList[i].dictValue());
//                     monsters.monsterTable.Add(monsterData.id, monsterData);
//                 }
//             }
//
//             return monsters;
//         }
//     }
//     public class MonsterObjSData {
//         public int id;
//         public string name;
//         public string prefab;
//         public string icon;
//         public int type;
//         public int hp;
//         public int att;
//         public int def;
//         public float rate;
//         public int move;
//         public List<int> skillPropIDs = new List<int>();
//
//         public static MonsterObjSData CreateWithSData(Dictionary<string, object> data) {
//             MonsterObjSData objData = new MonsterObjSData();
//
//             var attrDict = data.objectForKey("atts").dictValue();
//
//             objData.id = attrDict.intValueForKey("id");
//             objData.name = attrDict.valueForKey("name");
//             objData.prefab = attrDict.valueForKey("prefab");
//             objData.icon = attrDict.valueForKey("icon");
//             objData.type = attrDict.intValueForKey("type");
//             objData.hp = attrDict.intValueForKey("hp");
//             objData.att = attrDict.intValueForKey("att");
//             objData.def = attrDict.intValueForKey("def");
//             objData.rate = attrDict.floatValueForKey("rate");
//             objData.move = attrDict.intValueForKey("move");
//
//             string skillPropIDValue = attrDict.valueForKey("skill");
//             if(string.IsNullOrEmpty(skillPropIDValue) == false) {
//                 string[] skillPropIDs = skillPropIDValue.Split(';');
//                 for(int i = 0; i < skillPropIDs.Length; i++) {
//                     objData.skillPropIDs.Add(skillPropIDs[i].intValue());
//                 }
//             }
//
//             return objData;
//         }
//     }
//
//     public class EroicaSData {
//         public int heroID;
//         public List<int> intProps = new List<int>();
//         public List<float> floatProps = new List<float>();
//
//         public static EroicaSData CreateWithSData(Dictionary<string, object> data) {
//             EroicaSData eroica = new EroicaSData();
//             var list = data.objectForKey("attribute").listValue();
//             int FloatCount = 1;
//             int IntCount = list.Count - FloatCount;
//             for(int i = 0; i < IntCount; i++) {
//                 eroica.intProps.Add((int)list[i]);
//             }
//             for(int i = 0; i < FloatCount; i++) {
//                 eroica.floatProps.Add((float)list[IntCount + i]);
//             }
//             eroica.heroID = eroica.intProps[(int)PuppetIntPropID.Prop_hero_id];
//             return eroica;
//         }
//     }
//
//     public class RewardItem {
//         public int itemID;
//         public int num;
//         public float prob;  //掉落概率
//
//         static public RewardItem CreateItemWithStr(int aItemID, int aNum, float aProb) {
//             RewardItem item = new RewardItem();
//             item.itemID = aItemID;
//             item.num = aNum;
//             item.prob = aProb;
//             return item;
//         }
//     }
//
//     public int sceneID = -1;
//     public string sceneName;
//     public int recommendLevel;
//     public string bgm;
//     public int sceneExp;
//     public int sweepExp;
//
//     public List<EroicaSData> heroSDatas = new List<EroicaSData>();
//     public List<FetterSData> fetterSDatas = new List<FetterSData>();
//     public List<BuffSData> buffSDatas = new List<BuffSData>();
//     public List<RewardItem> rewardItems = new List<RewardItem>();
//     public float FetterAtkRate = 1f;
//     //<SkillLocalID, SkillSData>
//     public Dictionary<int, SkillSData> skillSDatas = new Dictionary<int, SkillSData>();
//
//     public BattleMonsterSData monsterSDatas;
//
//     bool m_isServerDataOK = false;
//
//     public void ClearData() {
//         sceneID = -1;
//         sceneName = "";
//         recommendLevel = 999;
//         sweepExp = 0;
//         rewardItems.Clear();
//         heroSDatas.Clear();
//         fetterSDatas.Clear();
//         buffSDatas.Clear();
//         skillSDatas.Clear();
//         monsterSDatas = null;
//         m_isServerDataOK = false;
//     }
//
//     public bool CheckServerDataOK() {
//         if(m_isServerDataOK == false && DebugSetting.Self.Debug_LocalScene == false) {
//             DebugUtil.LogErrorFormat("[BattleServerData] 战斗数据还未从服务器收到，不能使用数据。");
//         }
//         return m_isServerDataOK;
//     }
//
//     static public bool IsServerDataOK() {
//         if(instance == null || instance.m_isServerDataOK == false) {
//             return false;
//         }
//         return true;
//     }
//
//     public SkillSData GetSkillSData(int skillLocalID) {
//         SkillSData sdata = null;
//         skillSDatas.TryGetValue(skillLocalID, out sdata);
//         if(sdata == null) {
//             DebugUtil.LogErrorFormat("[BattleServerData] 服务器技能表中未找到技能，localID:[{0}]。", skillLocalID);
//         }
//         return sdata;
//     }
//
//     public void parseServerData(Dictionary<string, object> data) {
//         ClearData();
//
//         sceneID = data.intValueForKey("unitId"); //场景ID
//         sceneName = data.valueForKey("scene"); //场景名
//         recommendLevel = data.intValueForKey("level"); //推荐等级
//         string expValue = data.valueForKey("exp"); //通关经验;扫荡经验
//         string rewardValue = data.valueForKey("reward");
//         bgm = data.valueForKey("bgm");
//
//         if(string.IsNullOrEmpty(expValue) == false) {
//             string[] exps = expValue.Split(';');
//             sceneExp = exps[0].intValue();
//             sweepExp = exps[1].intValue();
//         }
//
//         if(string.IsNullOrEmpty(rewardValue) == false) {
//             string[] rewardStrs = rewardValue.Split('|', ';');
//             for(int i = 0; i < rewardStrs.Length / 3; i += 3) {
//                 RewardItem item = RewardItem.CreateItemWithStr(rewardStrs[i + 0].intValue(), rewardStrs[i + 1].intValue(), rewardStrs[i + 2].floatValue());
//                 rewardItems.Add(item);
//             }
//         }
//         IList heroDicts = data.objectForKey("eroica").listValue();//我方英雄数据
//         if(heroDicts != null) {
//             for(int i = 0; i < heroDicts.Count; i++) {
//                 EroicaSData heroData = EroicaSData.CreateWithSData(heroDicts[i].dictValue());
//                 heroSDatas.Add(heroData);
//             }
//         }
//         IList fetterDicts = data.objectForKey("fetter").listValue(); //羁绊
//         if(fetterDicts != null) {
//             FetterAtkRate = 1f;
//             for(int i = 0; i < fetterDicts.Count; i++) {
//                 FetterSData fetterData = FetterSData.CreateWithSData(fetterDicts[i].dictValue());
//                 fetterSDatas.Add(fetterData);
//                 if(fetterData.attType == (int)PuppetIntPropID.Prop_att)
//                     FetterAtkRate += (fetterData.attValue);
//             }
//         }
//         //怪物表
//         monsterSDatas = BattleMonsterSData.CreateWithSData(data.dictValueForKey("unitData"));
//
//         IList buffList = data.objectForKey("buffTable").listValue();//buff表
//         if(buffList != null) {
//             for(int i = 0; i < buffList.Count; i++) {
//                 BuffSData buffData = BuffSData.CreateWithSData(buffList[i].dictValue());
//                 buffSDatas.Add(buffData);
//             }
//         }
//         IList skillList = data.objectForKey("skill").listValue();//skill表
//         if(skillList != null) {
//             for(int i = 0; i < skillList.Count; i++) {
//                 SkillSData skillSData = SkillSData.CreateWithSData(skillList[i].dictValue());
//                 if(skillSDatas.TryAdd(skillSData.local_id, skillSData) == false) {
//                     DebugUtil.LogErrorFormat("[BattleServerData] 服务器数据（技能表）有重复项的。skillID:{0} skillLocalID：{0}", skillSData.id, skillSData.local_id);
//                 }
//             }
//         }
//
//         m_isServerDataOK = true;
//     }
//
// }
//
// }
